/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CapaLogica;

import CapaDatos.*;
import CapaSeguridad.GuateBayException;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.Date;
import java.util.Locale;

/**
 *
 * @author Cajas
 */
public class Logica {
    private Respuesta pedidoInterfaz;
    private Respuesta respuestaLogica;
    
    public Logica(){}
        
    public Respuesta realizarPedido(Respuesta pedido){
        this.pedidoInterfaz = pedido;
        
        switch(pedidoInterfaz.getTipoMensaje()){
            case 1:{
                registrar();
                break;
            }
            case 2:{
                autenticar();
                break;}
            case 31:{              
                verCategorias();
                break;
            }
            case 32:{
                verArticulosCategoria();
                break;
            }
            case 41:{
                vender();
                break;
            }
            case 42:{
                pujar();
                break;
            }
            case 5:{
                comprar();
                break;
            }
            case 6:{
                verPendientes();
                break;
            }
            case 7:{
                registrarProducto();
                break;
            }
            case 8:{
                obtenerRegiones();
                break;
            }
            case 9:{
                //Reportes
                verReporte(this.pedidoInterfaz.getTipoObjeto());
                break;
            }
        }        
        
        return this.respuestaLogica;
    }
    
    private void registrar(){          
        Usuario nuevo = (Usuario)this.pedidoInterfaz.getObjetoRespuesta();                
        this.respuestaLogica = nuevo.registrar();        
    }
    
    private void autenticar(){        
        Usuario usuario = (Usuario)this.pedidoInterfaz.getObjetoRespuesta();
        this.respuestaLogica = usuario.autenticar();
    }
    
    private void verCategorias(){                 
        Catalogo catalogo = new Catalogo();                
        this.respuestaLogica = catalogo.enviarCategorias();
    }    
  
    private void verArticulosCategoria(){
        Catalogo catalogo = new Catalogo();
        Categoria categoria = (Categoria)this.pedidoInterfaz.getObjetoRespuesta();
        this.respuestaLogica = catalogo.enviarArticulos(categoria.getIdCategoria());
    }
    
    private void vender(){
        Subasta subasta = (Subasta)this.pedidoInterfaz.getObjetoRespuesta();                
        Articulo articulo = subasta.getArticulo();
        articulo.setFechaIngreso(fecha(1));
        this.respuestaLogica = articulo.registrarArticulo(1, articulo.getId_usuario()); //Status = 1 (Disponible)
        if(this.respuestaLogica.getTipoMensaje()==0)
        {
            if(articulo.isSubasta()){
                articulo.setId_articulo((Integer)this.respuestaLogica.getObjetoRespuesta());
                subasta.setFechaInicio(fecha(1)); 
                subasta.setFechaExpiracion(fecha(2));
                this.respuestaLogica = articulo.subastar(subasta.getFechaInicio(), subasta.getValorInicial(), subasta.getFechaExpiracion(), true, articulo.getId_articulo());
            }
        }
    } 
    
    private void registrarProducto(){
        Articulo articulo = (Articulo)this.pedidoInterfaz.getObjetoRespuesta();                                        
        articulo.setFechaIngreso(fecha(1));
        this.respuestaLogica = articulo.registrarArticulo(1, articulo.getId_usuario());
    }
    
    private void pujar(){
        Puja puja = new Puja();
        this.respuestaLogica = puja.pujar();
    }
    
    private void comprar(){
        Compra compra = (Compra)this.pedidoInterfaz.getObjetoRespuesta();
        compra.setFechaCompra(fecha(1));
        compra.setStatusOrden(true);        
        this.respuestaLogica = compra.registrarCompra();        
    }
    
    private void verPendientes(){
    
    }
    
    private void obtenerRegiones(){
        try {
            Region_DAO regs = new Region_DAO();
            LinkedList<Region_POJO> regiones = regs.obtenerRegiones();
            this.respuestaLogica = new Respuesta();
            this.respuestaLogica.setTipoMensaje(0);
            this.respuestaLogica.setMensaje("Regiones obtenidas exitosamente");
            this.respuestaLogica.setObjetoRespuesta(regiones);
        } catch (GuateBayException exception) {
            this.respuestaLogica = new Respuesta();
            this.respuestaLogica.setTipoMensaje(0);
            this.respuestaLogica.setMensaje("Regiones obtenidas exitosamente");
            this.respuestaLogica.setObjetoRespuesta(null);         
            new CapaSeguridad.Error(exception).insertarError();            
        }
    }
    
    private String fecha(int tipo){
        SimpleDateFormat formato = new SimpleDateFormat("dd'/'MM'/'yyyy",new Locale("es_ES"));        
        if(tipo == 1){
            Date fechaDate = new Date();
            String fecha = formato.format(fechaDate);
            return fecha;
        }else if(tipo == 2){
            Calendar c1 = Calendar.getInstance();
            c1.add(Calendar.DATE,15);
            String fecha = formato.format(c1.getTime());
            return fecha;
        }
        return null;
    }
    
    private void verReporte(int tipo){
        String reporte = "";
        ResultSet res;
        switch(tipo){
            case 1:{
                //Reporte: Usuario con más rating                
                Rating_DAO rating = new Rating_DAO();
                res = rating.getTopRating();     
                int cont = 1;
                try{                    
                    while(res.next()){
                        reporte += "Posicion: "+cont+"\n";
                        reporte += "Usuario:  "+res.getString(1)+"\n";
                        reporte += "Rating:   "+res.getString(2)+"\n\n";                        
                    }
                    this.respuestaLogica.setTipoMensaje(0);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("Reporte de Usuarios con más rating");
                }catch(Exception ex){
                    this.respuestaLogica.setTipoMensaje(90);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("No existen usuarios ponderados");
                }
            }case 2:{
                //Reporte: Producto mas subastado                
                Subasta_DAO subasta = new Subasta_DAO();
                res = subasta.obtenerMasSubastados();
                int cont = 1;
                try{                    
                    while(res.next()){
                        reporte += "Posicion:     "+cont+"\n";
                        reporte += "Articulo:     "+res.getString(1)+"\n";
                        reporte += "No. Subastas: "+res.getString(2)+"\n\n";                        
                    }
                    this.respuestaLogica.setTipoMensaje(0);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("Reporte de Productos mas subastado");
                }catch(Exception ex){
                    this.respuestaLogica.setTipoMensaje(91);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("No existen productos subastados");
                }
            }case 3:{
                //Reporte: Producto mas comprado por categoria               
                Articulo_DAO articulo = new Articulo_DAO();
                res = articulo.repoProductosMasCompradosPorCategoria();                
                try{                    
                    while(res.next()){
                        reporte += "Categoria: "+res.getString(1)+"\n";
                        reporte += "Articulo:  "+res.getString(2)+" ";
                        reporte += "Cantidad de Compras: "+res.getString(3)+"\n\n";                        
                    }
                    this.respuestaLogica.setTipoMensaje(0);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("Reporte de Producto mas comprado por categoria");
                }catch(Exception ex){
                    this.respuestaLogica.setTipoMensaje(92);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("No existen compras");
                }
            }case 4:{
                //Reporte: Producto mas visitado                
                Visita_DAO visita = new Visita_DAO();
                String resp = visita.ReporteProductoMasVisitado();                
                if(resp!=null){
                    this.respuestaLogica.setTipoMensaje(0);
                    this.respuestaLogica.setObjetoRespuesta(resp);
                    this.respuestaLogica.setMensaje("Reporte de Producto mas visitado");
                }else{
                    this.respuestaLogica.setTipoMensaje(93);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("No existen productos visitados");
                }
            }case 5:{
                //Reporte: Pedidos de un usuario determinado              
                Pedido_DAO pedido = new Pedido_DAO();
                LinkedList<Pedido_POJO> listaPedido = pedido.obtenerPedidosUsuario((Integer)this.pedidoInterfaz.getParametro());               
                if(listaPedido!=null){                    
                    for(int i=0; i<listaPedido.size(); i++){
                        reporte += "Usuario: "+listaPedido.get(i).getIdUsuario();
                        reporte += "Compra: "+listaPedido.get(i).getIdPedido()+"\n";
                        reporte += "Shipping: "+listaPedido.get(i).getIdShipping()+"\n";
                        reporte += "Fecha de Ingreso: "+listaPedido.get(i).getFechaIngreso()+"\n";
                        reporte += "Estado de la Orden:  "+listaPedido.get(i).getStatusPago()+"\n";
                        reporte += "Orden Pagada: "+listaPedido.get(i).getStatusPago()+"\n";
                        if(listaPedido.get(i).getStatusPago()){
                            reporte += "Fecha de Pago: "+listaPedido.get(i).getFechaPago()+"\n";
                        }
                        reporte += "Descripcion: "+listaPedido.get(i).getDescripcion()+"\n\n";
                    }
                    this.respuestaLogica.setTipoMensaje(0);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("Reporte de Pedidos de un usuario determinado");
                }else{
                    this.respuestaLogica.setTipoMensaje(94);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("El usuario no tiene pedidos registrados");
                }
            }case 6:{
                //Reporte: Vendedor con más ventas en un año              
                Usuario_DAO usuario = new Usuario_DAO();
                res = usuario.repoVendedorMasVentas((String)this.pedidoInterfaz.getParametro());
                int cont = 1;
                try{                    
                    while(res.next()){
                        reporte += "Posicion:    "+cont+"\n";
                        reporte += "Usuario:     "+res.getString(1)+"\n";
                        reporte += "No. Articulos vendidos: "+res.getString(2)+"\n\n";                        
                    }
                    this.respuestaLogica.setTipoMensaje(0);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("Reporte de Vendedor con ventas en un año");
                }catch(Exception ex){
                    this.respuestaLogica.setTipoMensaje(95);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("No existen usuarios con ventas realizadas");
                }
            }case 7:{
                //Reporte: Articulos más vendidos en un año
                Articulo_DAO articulo = new Articulo_DAO();
                res = articulo.repoArticuloMasVendido((String)this.pedidoInterfaz.getParametro());
                int cont = 1;
                try{                    
                    while(res.next()){
                        reporte += "Posicion:     "+cont+"\n";
                        reporte += "Articulo:     "+res.getString(1)+"\n";
                        reporte += "Cantidad Vendida: "+res.getString(2)+"\n\n";                        
                    }
                    this.respuestaLogica.setTipoMensaje(0);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("Reporte de Articulos más vendidos en un año");
                }catch(Exception ex){
                    this.respuestaLogica.setTipoMensaje(96);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("No existen articulos vendidos");
                }
            }case 8:{
                //Reporte: Usuario con mayor número de compras en un año
                Usuario_DAO usuario = new Usuario_DAO();
                res = usuario.usuarioMasComprasxanio((Integer)this.pedidoInterfaz.getParametro());
                int cont = 1;
                try{                    
                    while(res.next()){
                        reporte += "Posicion:    "+cont+"\n";
                        reporte += "Usuario:     "+res.getString(1)+"\n";
                        reporte += "No. Compras: "+res.getString(2)+"\n";
                        reporte += "Año: "+res.getString(3)+"\n\n";                        
                    }
                    this.respuestaLogica.setTipoMensaje(0);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("Reporte de Usuario con mayor número de compras en un año");
                }catch(Exception ex){
                    this.respuestaLogica.setTipoMensaje(97);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("No existen usuarios con compras");
                }
            }case 9:{
                //Reporte: Producto con menos ventas en un año
                Articulo_DAO articulo = new Articulo_DAO();
                res = articulo.repoArticuloMenosVendido((String)this.pedidoInterfaz.getParametro());
                int cont = 1;
                try{                    
                    while(res.next()){
                        reporte += "Posicion:    "+cont+"\n";
                        reporte += "Articulo:     "+res.getString(1)+"\n";
                        reporte += "Cantidad de Ventas: "+res.getString(2)+"\n\n";                        
                    }
                    this.respuestaLogica.setTipoMensaje(0);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("Reporte de Producto con menos ventas en un año");
                }catch(Exception ex){
                    this.respuestaLogica.setTipoMensaje(98);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("No existen productos con vendidos");
                }
            }case 10:{
                //Reporte: Producto más visitado por cliente
                Visita_DAO visita = new Visita_DAO();
                res = visita.ReporteProductoMasVisitadoPorCliente();
                int cont = 1;
                try{                    
                    while(res.next()){
                        reporte += "Posicion: "+cont+"\n";
                        reporte += "Producto: "+res.getString(1)+"\n";
                        reporte += "Usuario:  "+res.getString(2)+"\n";
                        reporte += "Visitas:  "+res.getString(3)+"\n\n";                        
                    }
                    this.respuestaLogica.setTipoMensaje(0);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("Reporte de Producto mas visitado por cliente");
                }catch(Exception ex){
                    this.respuestaLogica.setTipoMensaje(99);
                    this.respuestaLogica.setObjetoRespuesta(reporte);
                    this.respuestaLogica.setMensaje("No existen productos visitados");
                }
            }                                        
        }
    }
}
